package com.qf.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author 高圆圆
 * @date 2023/5/23 14:12
 * 自定义工具类,加入德鲁伊连接池Druid
 *
 *  1)读取jdbc.properties
 *  2)获取DataSource数据源对象
 *  3)封装一个方法:获取连接对象的方法
 */
public class DruidJdbcUtils {


    //声明ds变量,类型javax.sql.DataSource
    private static DataSource ds ;

    //加入ThreadLocal:模拟线程:每一个线程使用自己的Connection
    //静态实例
    private static ThreadLocal<Connection> tl = new ThreadLocal<>() ;

    //构造方法私有
    private DruidJdbcUtils(){}
    static{
       /* ExecutorService executorService = Executors.newFixedThreadPool(2);*/
        try {
            //读取druid德鲁伊连接池的配置文件
            InputStream inputStream = DruidJdbcUtils.class.getClassLoader().
                    getResourceAsStream("jdbc.properties");
            //创建属性集合列表
            Properties prop = new Properties() ;

            //加载字节输入流到属性集合列表中
            prop.load(inputStream) ;
            //通过德鲁伊的数据源工厂:创建数据源
            ds = DruidDataSourceFactory.createDataSource(prop);
            System.out.println(prop);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //获取数据源DataSource
    public static DataSource getDataSource(){
        return  ds ;
    }


    //封装一个静态方法
    public static Connection getConnection(){

        try {
            //1)从当前线程中获取connection
            //ThreadLocal:public T get() :获取指定的存储的内容(Connection)
            Connection conn = tl.get() ;
            //2)判断从线程中获取Connection如果为null
            if(conn==null){
                //说明当前线程中没有连接对象在上面进行绑定
                //应该从数据源DataSource获取Connection(连接池中取)
                conn = ds.getConnection();
                // 将从连接池获取到的连接对象绑定在当前线程tl上
                //public void set(T value)
                tl.set(conn) ;
            }
            return conn ;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return  null ;
    }


    public static void main(String[] args) {
        System.out.println(DruidJdbcUtils.getDataSource());
        System.out.println("-------------------------------");
        Connection connection = DruidJdbcUtils.getConnection();
        System.out.println(connection);
    }
}
